/*!
	@author Angéline Guignard & Adrien Megueddem
	@copyright Imagimp
	@language C
    @header Header de Gestion d'images
    La gestion de tous ce qui concerne les images comme le chargement
	d'une image, l'affichage d'une image, etc...
    @updated 2012-12-10
 */

/*!
	@class Image
	@discussion La gestion de tous ce qui concerne les images comme le chargement
	d'une image, l'affichage d'une image, etc...
*/

#ifndef _GLIMAGIMP__IMAGE_H___
#define _GLIMAGIMP__IMAGE_H___

/**************
** Strctures **
**************/

/*!
    @typedef Structure d'une image
    @abstract Structure qui définit ce qu'est une image
    @field nbLines, définit le nombre de lignes de l'image qui équivaut à la hauteur.
    @field nbColumns, définit le nombre de colonnes de l'image qui équivaut à la largeur.
    @field pixels, tableau de pixels qui répertori tout les pixels qui servent à construire l'image.
 */
 
typedef struct image{
    unsigned char* type;
    int nbColumns;
    int nbLines;
    int maxValueColor;
    unsigned char* pixels;
}Image;

/*!
    @typedef Structure d'un espace de stockage d'images.
    @abstract Structure qui définit un espace de stockage d'images dans lequel chaque nouvelle image sera créée.
    @field capacite, compte le nombre d'image présent dans l'espace de stockage.
    @field album, tableau d'image qui stock toutes les images.
 */
 
typedef struct storage{ //Stockage d'images
    int lastKey;
    int capacite;
    Image* album;
}Storage;

/****************
** Définitions **
****************/

/*!
    checkStorage() permet de vérifier si il y a assez d'espace dans l'album pour stocker la futur image.
    @param storage
        Storage* storage est le premier paramètre.
    @result
        Modifie le storage.
 */
extern Storage* checkStorage(Storage* storage);

/*!
    stockImg() permet de stocker l'image dans l'espace de stockage.
    @param data
        Image* data est le premier paramètre qui prend les données de l'image.
    @param img
        Storage* storage est le second paramètre qui prend l'espace de stockage dans lequel sera stocké l'image.
    @result
        Modifie le storage.
 */
extern Storage* stockImg(Image* data, Storage* storage);

/*!
    openImg() permet de charger l'image à partir d'un fichier ppm.
    @param img
        char* img est le premier paramètre.
    @result
        retourne les données de l'image.
 */
extern Storage* scanImg(char* img, Storage* storage);

/*!
    getImg() permet d'afficher l'image après son chargment.
    @param data
        int* data est le premier paramètre.
    @result
        printf une chaine de caractère passé en argument.
 */
extern unsigned char* inverseImg(Image* img);

/*!
    background() permet de définir une image d'arrière plan blanche pour le premier calque du programme.
    @result
        Retourne un tableau de pixels qui définit une image blanche.
        Laquel sera affiché plus tard sur un calque.
        Si NULL retourné, bug d'allocation mémoire.
 */
Image* background(int w_im, int h_im);

/*!
    writeppm() permet de sauvegarder la modification d'image en .ppm.
    @param image
        Image* image prend en paramètre l'image en question.
    @param nom
        char* nom permet de nommer le premier ppm.
    @result
        Créer un fichier ppm.
 */
int writeppm(Image* image, char *nom);

#endif